/*
 * Copyright (c) 2007 T.Cogghe, D.Leroux, S.Lévignac, S.Rives
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#ifndef __IHM_FENETREE_H__
#define __IHM_FENETREE_H__

#include "Image.hh"
#include "ImageFinale.hh"
#include "Astre.hh"
#include <vector>


class IHM {
private:
	/*!< référence globale de la première instance de l'IHM. Permet aux classes internes de bénéficier d'un environnement commun */
	static IHM*env;

	class FenetreFichiers;
	class FenetreAstres;
	class FenetreDark;
	class FenetreTraitement;
	class FenetreFinale;
	class DialogueFichiers;
	class DialogueRepertoire;

	class DialogueSauver;
	class DialogueQuitter;
	class DialogueErreurMatrice;
	class DialogueErreurForme;

	class FenetreFichiers* fFic;
	class FenetreAstres* fAst;
	class FenetreDark* fDark;
	class FenetreTraitement* fTra;
	class FenetreFinale* fFin;
	class DialogueFichiers* dFic;
	class DialogueRepertoire* dRep;

	class DialogueSauver* dSauv;
	class DialogueQuitter* dQuit;
	class DialogueErreurMatrice* dErrMatrice;
	class DialogueErreurForme* dErrForme;



	friend class SpawnFileList;	/* passage obligé pour utiliser le foreach du treemodel
					 * sans laisser traîner de Gtk::* ici */
	/* FIXME : en attendant les formes, sélection manuelle sur toutes les images et gestion à l'arrache des astres */


public:
	bool autoDetection;
	bool avecDark;
	int imgDetection;

	double prog;				/* progression du traitement (thread-safe) */
	std::string texte;			/* texte à ajouter dans la zone d'état du traitement */
	std::vector<std::string> fichiers;	/* liste des fichiers */
	std::vector<Image*> images;		/* liste des images */

	class EditAstres;
	EditAstres*edAs;

	void ajoutListe(std::string fic);

	void initListeImages(std::vector<std::string>fichiers);

	void proxyTraitement();

	IHM(int& argc,char**&argv);	/* crée l'interface et lance la première fenêtre (Fichiers) */
	virtual ~IHM();	/* force la terminaison du programme */

	void run();	/* indispensable */

	/* manipulation de la liste d'images à traiter
	 */
	unsigned int nbImages() const;
	Image* image(const unsigned int n) const;

	/* manipulation de l'image finale
	 */
	Image* imageFinale(const Image* i=NULL);

	/* affichage de l'état pendant le traitement
	 */
	//void etatAjouterTexte(std::string&);
	/* mise à jour de la barre de progression
	 * (valeur entre 0 et 1)
	 */
	void majProgression(std::string&,double);
	void traitementFini();

	void demarreTraitement();

protected:
	bool formesDetectees;			/*!< permet au traitement de savoir s'il faut recalculer ou non les formes des images */
	ImageFinale*iFin;			/*!< outil d'édition de l'image finale */
	/*! fonction à surcharger, retourne 0 si tout va bien */
	virtual int traitement();

	/*! fonction à surcharger, pour indiquer à la routine de traitement qu'il faut terminer */
	virtual void traitementAnnule();	
private:

	/*! outil de développement : choix de la fenêtre de départ */
	int _debut;

};


#define getW(__x,__w,__n) do {					\
				__w = 0;			\
				__x->get_widget(__n,__w);	\
				assert(__w);			\
			  } while(0)



#define getWD(__x,__w,__n) do {					\
				__w = 0;			\
				__x->get_widget_derived(__n,__w);	\
				assert(__w);			\
			  } while(0)





#endif
